1. 首页 > 软件园

JavaScript数组的进化 javascript数组的正确方法

作者:admin 更新时间:2024-08-13
摘要:JavaScript数组在内部实现上并不是连续的,而更类似于哈希映射或字典。这使得JavaScript数组有些像是一门B级语言,因为数组的实现方式并不合适。
为什么说JavaScript数组不是真正,JavaScript数组的进化 javascript数组的正确方法

 

大家好,本网站为大家提供优质的、全新的游戏攻略,援助大家更愉悦地、更顺手地玩游戏,走过路过不要错过奥。

JavaScript数组在内部实现上并不是连续的,而更类似于哈希映射或字典。这使得JavaScript数组有些像是一门B级语言,由于数组的实现方式并不合适。

何故说JavaScript数组不是真正的数组

数组是一串连续的内存位置,用来保存某些值。重要的是要注意“连续”这个词。下图展示了数组在内存中的存储方式。一个包含4个元素的数组,每个元素占据4个字节,总共占用16个字节的内存空间。假设我们声明了一个tinyInt arr[4],该数组在内存中的地址从1201开始。当我们需要读取arr[2]时,只需要进行数学计算,即1201 (2 * 4),接着从1209开始读取即可。

JavaScript数组与诚实数组的不同之处

JavaScript中的数据通过哈希映射实现,可以使用不同的数据结构,如链表。因此,若果在JavaScript中声明一个数组var arr new Array(4),计算机将生成类似上图的结构。若果程序需要读取arr[2],则需要从1201开始遍历寻址。很明显,数学计算比遍历链表快,尤其对于较长的数组而言。这就是JavaScript数组与诚实数组的差异。

JavaScript数组的进化

JavaScript语言本身也在不息演化。从V8、SpiderMonkey到TC39以及日益增长的Web用户群体,巨大的努力使JavaScript成为全球必备技术。当用户基数巨大时,性能提升变得特别重要。

现代的JavaScript引擎会为数组分配连续的内存,前提是数组是同质的(全部元素类型相同)。杰出的程序员通常会保证数组的同质性,以便JIT(即时编译器)能够使用C编译器风格的技巧来读取元素。若果代码编写得不太糟糕,JavaScript Array对象在幕后依旧以真正的数组形式存在,这对现代的JavaScript开发者来说特别重要。

随着ES2015/ES6的推出,数组也有了更多的演进。TC39决定引入类型化数组(Typed Arrays),于是我们有了ArrayBuffer。ArrayBuffer提供一块连续的内存,可以随便操作。直接操作内存可能过于复杂和底层,因此产生了处理ArrayBuffer的视图(View)。目前已经有一些可用的视图,将来还会有更多加入。

了解更多关于类型化数组的智慧

若果想要了解更多关于类型化数组(Typed Arrays)的智慧,请访问MDN文档。高性能、高效率的类型化数组在WebGL之后被引入。WebGL开发者面临着处理二进制数据的性能难题。使用SharedArrayBuffer可以在多个Web Worker进程之间共享数据,提升性能。

旧式数组 vs 类型化数组:性能

前面已经探讨了JavaScript数组的演进,此刻我们来测试现代数组带来的性能收益有多大。

旧式数组和ArrayBuffer的性能几乎相同,现代编译器已经足够智能,可以将元素类型相同的传统数组在内部转换成内存连续的数组。第一个例子就是这样。虽然使用了new Array(LIMIT),数组实际上依旧以现代数组的形式存在。

接下来,我们将修改第一个例子,将数组改为异构型(元素类型不完全一致),看看是否存在性能差异。

修改发生在第3行,添加一条语句将数组变为异构类型。其余代码保持不变。结局显示性能差异明显,慢了22倍。

类型化数组的引入

类型化数组的引入是JavaScript进步历程中的一大步。Int8Array、Uint8Array、Uint8ClampedArray、Int16Array、Uint16Array、Int32Array、Uint32Array、Float32Array、Float64Array等都是类型化数组的视图,它们使用原生字节序(与本机相同)。我们还可以使用DataView创建自定义的视图窗口。期望将来会有更多的DataView库援助我们轻松操作ArrayBuffer。

JavaScript数组的演进特别不错。此刻它们速度快、效率高、健壮,而且在内存分配方面也足够智能。

版权声明:这篇文章小编将内容由互联网用户自发贡献,本站不承担相关法律职责.如有侵权/违法内容,本站将即刻删除。

大家注意,牢记持续关注本游戏攻略网站,无论兄弟们的支持是我们最大的动力奥,我们会努力提供全网新的游戏攻略教程,加油。

本创作内容,未授权勿转载,必究权责。

免责说明:这篇文章小编将代表的是网站编辑的见解,与本站无关。其原创性、诚实性以及文中陈述文字和内容未经确认,因此对这篇文章小编将以及其中全部或者部份内容文字的诚实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。